// 对axios进行封装
// 作用：封装一个网络请求的工具对象
// 把公共的抽离放到这里
import axios from 'axios'
import JSONbig from 'json-bigint'
import { Message } from 'element-ui'
import to from './to'
const ajax = axios.create({ // 生成一个自定义的axios对象
  baseURL: 'http://api-toutiao-web.itheima.net', // 配置公共的地址
  // 作用  所有的网络请求都会在前面拼接这个地址
  transformResponse: [function (data) { // 对内容进行处理
    // data:就是本次请求获取的数据
    // 在这里可以对它进行进一步的处理 -- JSONbig
    // 后端返回数据可能不是 JSON 字符串，而JSONbig.parse()只能处理JSON字符串
    // 所以，为了保证代码可以正常执行，这里引入try-catch来捕获异常
    try {
      // 如果没有遇到错误，就返回 JSONbig处理之后的数据
      return JSONbig.parse(data)
    } catch (err) {
      // console.error('JSONbig转换出错', err)
      return data
    }
  }]
})

// 添加请求拦截器
ajax.interceptors.request.use(function (config) {
  // 在发送请求之前做些什么
  config.headers.Authorization = 'Bearer ' + sessionStorage.getItem('token')
  return config
}, function (error) {
  // 对请求错误做些什么
  return Promise.reject(error)
})

// 添加响应拦截器
ajax.interceptors.response.use(function (response) {
  // 对响应数据做点什么
  return response
}, function (error) {
  // 对响应错误做点什么

  // 写一个中英文对照
  // 因为如果账号或者验证码错误 后台提示信息返回的是英文  所以需要处理一下 在显示给用户
  // 经logdir（error）的打印，发现error.response.data.message 对应后台的错误提示信息
  const errTxtObj = { // 自己写的中英文对照(后台给的错误提示太....了)
    'Please verify your real information in app.': '手机号只能用固定的',
    'Invalid code.': '验证码错误',
    'User must be authorized.': '身份验证失败',
    'Invalid cover param.': '封面图片有问题_请根据选择的数量传递'
  }

  let messageKey // 取出后台返回的message提示消息
  if (typeof error.response.data.message === 'object') {
    messageKey = error.response.data.message.cover
  } else {
    messageKey = error.response.data.message
  }
  // 给一个弹窗-element-ui的  因为是单独引用的，所以根据文档 在上边单独引入了方法 所以这里就可以用el-ui的弹窗了
  Message({
    message: errTxtObj[messageKey],
    type: 'error',
    duration: 2000,
    onClose () {
      // 看文档得知 401错误证明token不对或被修改了 所以 需要返回login
      if (error.response.status === 401) {
        // 为何不用this.$router.push 因为this现在指向的不是Vue 而是ajax 所以用原生的
        sessionStorage.clear()
        window.location.href = '/#/login'
      }
    }
  })

  return Promise.reject(error)
})

export default function (obj) {
  const promiseByAxios = ajax(obj)
  return to(promiseByAxios)
}

// 把设有全局基地地址ajax导出

// 外部用法：
// import request from '路径'
// Request({
//     url:'地址',
//     method:'post'
// })
